<?php
/**
 * @version		$Id: itemlist.php 1885 2013-02-08 11:45:29Z lefteris.kavadas $
 * @package		K2
 * @author		JoomlaWorks http://www.joomlaworks.net
 * @copyright	Copyright (c) 2006 - 2013 JoomlaWorks Ltd. All rights reserved.
 * @license		GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 */

// no direct access
defined('_JEXEC') or die ;

jimport('joomla.application.component.model');

JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');

class K2ModelItemlist extends K2Model
{

    function getData($ordering = NULL)
    {

        $user = JFactory::getUser();
        $aid = $user->get('aid');
        $db = JFactory::getDBO();
        $params = K2HelperUtilities::getParams('com_k2');
        $limitstart = JRequest::getInt('limitstart');
        $limit = JRequest::getInt('limit');
        $task = JRequest::getCmd('task');
        if ($task == 'search' && $params->get('googleSearch'))
            return array();

        $jnow = JFactory::getDate();
        $now = K2_JVERSION == '15' ? $jnow->toMySQL() : $jnow->toSql();
        $nullDate = $db->getNullDate();

        if (JRequest::getWord('format') == 'feed')
            $limit = $params->get('feedLimit');

        $query = "SELECT i.*, CASE WHEN i.modified = 0 THEN i.created ELSE i.modified END as lastChanged, c.name as categoryname,c.id as categoryid, c.alias as categoryalias, c.params as categoryparams";
        if ($ordering == 'best')
            $query .= ", (r.rating_sum/r.rating_count) AS rating";

        $query .= " FROM #__k2_items as i RIGHT JOIN #__k2_categories AS c ON c.id = i.catid";

        if ($ordering == 'best')
            $query .= " LEFT JOIN #__k2_rating r ON r.itemID = i.id";

        //Changed the query for the tag case for better performance
        //if ($task == 'tag')
        //		$query .= " LEFT JOIN #__k2_tags_xref AS tags_xref ON tags_xref.itemID = i.id LEFT JOIN #__k2_tags AS tags ON tags.id = tags_xref.tagID";

        if ($task == 'user' && !$user->guest && $user->id == JRequest::getInt('id'))
        {
            $query .= " WHERE ";
        }
        else
        {
            $query .= " WHERE i.published = 1 AND ";
        }

        if (K2_JVERSION != '15')
        {

            $query .= "i.access IN(".implode(',', $user->getAuthorisedViewLevels()).")"." AND i.trash = 0"." AND c.published = 1"." AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).")"." AND c.trash = 0";

            $mainframe = JFactory::getApplication();
            $languageFilter = $mainframe->getLanguageFilter();
            if ($languageFilter)
            {
                $languageTag = JFactory::getLanguage()->getTag();
                $query .= " AND c.language IN (".$db->quote($languageTag).",".$db->quote('*').") 
						AND i.language IN (".$db->quote($languageTag).",".$db->quote('*').")";
            }
        }
        else
        {
            $query .= "i.access <= {$aid}"." AND i.trash = 0"." AND c.published = 1"." AND c.access <= {$aid}"." AND c.trash = 0";
        }

        if (!($task == 'user' && !$user->guest && $user->id == JRequest::getInt('id')))
        {
            $query .= " AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." )";
            $query .= " AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." )";
        }

        //Build query depending on task
        switch ($task)
        {

            case 'category' :
                $id = JRequest::getInt('id');

                $category = JTable::getInstance('K2Category', 'Table');
                $category->load($id);
                $cparams = class_exists('JParameter') ? new JParameter($category->params) : new JRegistry($category->params);

                if ($cparams->get('inheritFrom'))
                {

                    $parent = JTable::getInstance('K2Category', 'Table');
                    $parent->load($cparams->get('inheritFrom'));
                    $cparams = class_exists('JParameter') ? new JParameter($parent->params) : new JRegistry($parent->params);
                }

                if ($cparams->get('catCatalogMode'))
                {
                    $query .= " AND c.id={$id} ";
                }
                else
                {
                    $categories = $this->getCategoryTree($id);
                    $sql = @implode(',', $categories);
                    $query .= " AND c.id IN ({$sql})";
                }

                break;

            case 'user' :
                $id = JRequest::getInt('id');
                $query .= " AND i.created_by={$id} AND i.created_by_alias=''";
                $categories = $params->get('userCategoriesFilter', NULL);
                if (is_array($categories))
                {
                    $categories = array_filter($categories);
                    JArrayHelper::toInteger($categories);
                    $query .= " AND c.id IN(".implode(',', $categories).")";
                }
                if (is_string($categories) && $categories > 0)
                {
                    $query .= " AND c.id = {$categories}";
                }
                break;

            case 'search' :
                $badchars = array('#', '>', '<', '\\');
                $search = JString::trim(JString::str_ireplace($badchars, '', JRequest::getString('searchword', null)));
                $sql = $this->prepareSearch($search);
                if (!empty($sql))
                {
                    $query .= $sql;
                }
                else
                {
                    $rows = array();
                    return $rows;
                }
                break;

            case 'date' :
                if ((JRequest::getInt('month')) && (JRequest::getInt('year')))
                {
                    $month = JRequest::getInt('month');
                    $year = JRequest::getInt('year');
                    $query .= " AND MONTH(i.created) = {$month} AND YEAR(i.created)={$year} ";
                    if (JRequest::getInt('day'))
                    {
                        $day = JRequest::getInt('day');
                        $query .= " AND DAY(i.created) = {$day}";
                    }

                    if (JRequest::getInt('catid'))
                    {
                        $catid = JRequest::getInt('catid');
                        $query .= " AND c.id={$catid}";
                    }

                }
                break;

            case 'tag' :
                $tag = JRequest::getString('tag');
                jimport('joomla.filesystem.file');
                if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $task == 'tag')
                {

                    $registry = JFactory::getConfig();
                    $lang = K2_JVERSION == '30' ? $registry->get('jflang') : $registry->getValue('config.jflang');

                    $sql = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
                    $sql .= " WHERE jfc.value = ".$db->Quote($tag);
                    $sql .= " AND jfc.reference_table = 'k2_tags'";
                    $sql .= " AND jfc.reference_field = 'name' AND jfc.published=1";

                    $db->setQuery($sql, 0, 1);
                    $result = $db->loadResult();

                }

                if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_falang'.DS.'falang.php') && $task == 'tag')
                {

                    $registry = JFactory::getConfig();
                    $lang = K2_JVERSION == '30' ? $registry->get('jflang') : $registry->getValue('config.jflang');

                    $sql = " SELECT reference_id FROM #__falang_content as fc LEFT JOIN #__languages as fl ON fc.language_id = fl.lang_id";
                    $sql .= " WHERE fc.value = ".$db->Quote($tag);
                    $sql .= " AND fc.reference_table = 'k2_tags'";
                    $sql .= " AND fc.reference_field = 'name' AND fc.published=1";

                    $db->setQuery($sql, 0, 1);
                    $result = $db->loadResult();

                }

                if (!isset($result) || $result < 1)
                {
                    $sql = "SELECT id FROM #__k2_tags WHERE name=".$db->Quote($tag);
                    $db->setQuery($sql, 0, 1);
                    $result = $db->loadResult();
                }

                $query .= " AND i.id IN (SELECT itemID FROM #__k2_tags_xref WHERE tagID=".(int)$result.")";

                /*if (isset($result) && $result > 0) {
                 $query .= " AND (tags.id) = {$result}";
                 } else {
                 $query .= " AND (tags.name) = ".$db->Quote($tag);
                 }*/

                $categories = $params->get('categoriesFilter', NULL);
                if (is_array($categories))
                {
                    JArrayHelper::toInteger($categories);
                    $query .= " AND c.id IN(".implode(',', $categories).")";
                }
                if (is_string($categories))
                    $query .= " AND c.id = {$categories}";
                break;

            default :
                $searchIDs = $params->get('categories');

                if (is_array($searchIDs) && count($searchIDs))
                {

                    if ($params->get('catCatalogMode'))
                    {
                        $sql = @implode(',', $searchIDs);
                        $query .= " AND c.id IN ({$sql})";
                    }
                    else
                    {

                        $result = $this->getCategoryTree($searchIDs);
                        if (count($result))
                        {
                            $sql = @implode(',', $result);
                            $query .= " AND c.id IN ({$sql})";
                        }
                    }
                }

                break;
        }

        //Set featured flag
        if ($task == 'category' || empty($task))
        {
            if (JRequest::getInt('featured') == '0')
            {
                $query .= " AND i.featured != 1";
            }
            else if (JRequest::getInt('featured') == '2')
            {
                $query .= " AND i.featured = 1";
            }
        }

        //Remove duplicates
        //$query .= " GROUP BY i.id";

        //Set ordering
        switch ($ordering)
        {

            case 'date' :
                $orderby = 'i.created ASC';
                break;

            case 'rdate' :
                $orderby = 'i.created DESC';
                break;

            case 'alpha' :
                $orderby = 'i.title';
                break;

            case 'ralpha' :
                $orderby = 'i.title DESC';
                break;

            case 'order' :
                if (JRequest::getInt('featured') == '2')
                    $orderby = 'i.featured_ordering';
                else
                    $orderby = 'c.ordering, i.ordering';
                break;

            case 'rorder' :
                if (JRequest::getInt('featured') == '2')
                    $orderby = 'i.featured_ordering DESC';
                else
                    $orderby = 'c.ordering DESC, i.ordering DESC';
                break;

            case 'featured' :
                $orderby = 'i.featured DESC, i.created DESC';
                break;

            case 'hits' :
                $orderby = 'i.hits DESC';
                break;

            case 'rand' :
                $orderby = 'RAND()';
                break;

            case 'best' :
                $orderby = 'rating DESC';
                break;

            case 'modified' :
                $orderby = 'lastChanged DESC';
                break;

            case 'publishUp' :
                $orderby = 'i.publish_up DESC';
                break;

            case 'id' :
            default :
                $orderby = 'i.id DESC';
                break;
        }

        $query .= " ORDER BY ".$orderby;
        $dispatcher = JDispatcher::getInstance();
        JPluginHelper::importPlugin('k2');
        $dispatcher->trigger('onK2BeforeSetQuery', array(&$query));
        $db->setQuery($query, $limitstart, $limit);
        $rows = $db->loadObjectList();
        return $rows;
    }

    function getTotal()
    {

        $user = JFactory::getUser();
        $aid = $user->get('aid');
        $db = JFactory::getDBO();
        $params = K2HelperUtilities::getParams('com_k2');
        $task = JRequest::getCmd('task');

        if ($task == 'search' && $params->get('googleSearch'))
            return 0;

        $jnow = JFactory::getDate();
        $now = K2_JVERSION == '15' ? $jnow->toMySQL() : $jnow->toSql();
        $nullDate = $db->getNullDate();

        $query = "SELECT COUNT(*) FROM #__k2_items as i RIGHT JOIN #__k2_categories c ON c.id = i.catid";

        if ($task == 'tag')
            $query .= " LEFT JOIN #__k2_tags_xref tags_xref ON tags_xref.itemID = i.id LEFT JOIN #__k2_tags tags ON tags.id = tags_xref.tagID";

        if ($task == 'user' && !$user->guest && $user->id == JRequest::getInt('id'))
        {
            $query .= " WHERE ";
        }
        else
        {
            $query .= " WHERE i.published = 1 AND ";
        }

        if (K2_JVERSION != '15')
        {
            $query .= "i.access IN(".implode(',', $user->getAuthorisedViewLevels()).")"." AND i.trash = 0"." AND c.published = 1"." AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).")"." AND c.trash = 0";

            $mainframe = JFactory::getApplication();
            $languageFilter = $mainframe->getLanguageFilter();
            if ($languageFilter)
            {
                $languageTag = JFactory::getLanguage()->getTag();
                $query .= " AND c.language IN (".$db->quote($languageTag).",".$db->quote('*').") 
						AND i.language IN (".$db->quote($languageTag).",".$db->quote('*').")";
            }
        }
        else
        {
            $query .= "i.access <= {$aid}"." AND i.trash = 0"." AND c.published = 1"." AND c.access <= {$aid}"." AND c.trash = 0";
        }

        $query .= " AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." )";
        $query .= " AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." )";

        //Build query depending on task
        switch ($task)
        {

            case 'category' :
                $id = JRequest::getInt('id');

                $category = JTable::getInstance('K2Category', 'Table');
                $category->load($id);
                $cparams = class_exists('JParameter') ? new JParameter($category->params) : new JRegistry($category->params);

                if ($cparams->get('inheritFrom'))
                {

                    $parent = JTable::getInstance('K2Category', 'Table');
                    $parent->load($cparams->get('inheritFrom'));
                    $cparams = class_exists('JParameter') ? new JParameter($parent->params) : new JRegistry($parent->params);
                }

                if ($cparams->get('catCatalogMode'))
                {
                    $query .= " AND c.id={$id} ";
                }
                else
                {
                    $categories = $this->getCategoryTree($id);
                    $sql = @implode(',', $categories);
                    $query .= " AND c.id IN ({$sql})";
                }

                break;

            case 'user' :
                $id = JRequest::getInt('id');
                $query .= " AND i.created_by={$id} AND i.created_by_alias=''";
                $categories = $params->get('userCategoriesFilter', NULL);
                if (is_array($categories))
                {
                    $categories = array_filter($categories);
                    JArrayHelper::toInteger($categories);
                    $query .= " AND c.id IN(".implode(',', $categories).")";
                }
                if (is_string($categories) && $categories > 0)
                {
                    $query .= " AND c.id = {$categories}";
                }
                break;

            case 'search' :
                $badchars = array('#', '>', '<', '\\');
                $search = trim(str_replace($badchars, '', JRequest::getString('searchword', null)));
                $sql = $this->prepareSearch($search);
                if (!empty($sql))
                {
                    $query .= $sql;
                }
                else
                {
                    $result = 0;
                    return $result;
                }
                break;

            case 'date' :
                if ((JRequest::getInt('month')) && (JRequest::getInt('year')))
                {
                    $month = JRequest::getInt('month');
                    $year = JRequest::getInt('year');
                    $query .= " AND MONTH(i.created) = {$month} AND YEAR(i.created)={$year} ";
                    if (JRequest::getInt('day'))
                    {
                        $day = JRequest::getInt('day');
                        $query .= " AND DAY(i.created) = {$day}";
                    }

                    if (JRequest::getInt('catid'))
                    {
                        $catid = JRequest::getInt('catid');
                        $query .= " AND c.id={$catid}";
                    }

                }
                break;

            case 'tag' :
                $tag = JRequest::getString('tag');
                jimport('joomla.filesystem.file');
                if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $task == 'tag')
                {

                    $registry = JFactory::getConfig();
                    $lang = K2_JVERSION == '30' ? $registry->get('jflang') : $registry->getValue('config.jflang');

                    $sql = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
                    $sql .= " WHERE jfc.value = ".$db->Quote($tag);
                    $sql .= " AND jfc.reference_table = 'k2_tags'";
                    $sql .= " AND jfc.reference_field = 'name' AND jfc.published=1";

                    $db->setQuery($sql, 0, 1);
                    $result = $db->loadResult();

                }

                if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_falang'.DS.'falang.php') && $task == 'tag')
                {

                    $registry = JFactory::getConfig();
                    $lang = K2_JVERSION == '30' ? $registry->get('jflang') : $registry->getValue('config.jflang');

                    $sql = " SELECT reference_id FROM #__falang_content as fc LEFT JOIN #__languages as fl ON fc.language_id = fl.lang_id";
                    $sql .= " WHERE fc.value = ".$db->Quote($tag);
                    $sql .= " AND fc.reference_table = 'k2_tags'";
                    $sql .= " AND fc.reference_field = 'name' AND fc.published=1";

                    $db->setQuery($sql, 0, 1);
                    $result = $db->loadResult();

                }

                if (isset($result) && $result > 0)
                {
                    $query .= " AND (tags.id) = {$result}";
                }
                else
                {
                    $query .= " AND (tags.name) = ".$db->Quote($tag);
                }
                $categories = $params->get('categoriesFilter', NULL);
                if (is_array($categories))
                    $query .= " AND c.id IN(".implode(',', $categories).")";
                if (is_string($categories))
                    $query .= " AND c.id = {$categories}";
                break;

            default :
                $searchIDs = $params->get('categories');

                if (is_array($searchIDs) && count($searchIDs))
                {

                    if ($params->get('catCatalogMode'))
                    {
                        $sql = @implode(',', $searchIDs);
                        $query .= " AND c.id IN ({$sql})";
                    }
                    else
                    {
                        $result = $this->getCategoryTree($searchIDs);
                        if (count($result))
                        {
                            $sql = @implode(',', $result);
                            $query .= " AND c.id IN ({$sql})";
                        }
                    }
                }

                break;
        }

        //Set featured flag
        if ($task == 'category' || empty($task))
        {
            if (JRequest::getVar('featured') == '0')
            {
                $query .= " AND i.featured != 1";
            }
            else if (JRequest::getVar('featured') == '2')
            {
                $query .= " AND i.featured = 1";
            }
        }
        $dispatcher = JDispatcher::getInstance();
        JPluginHelper::importPlugin('k2');
        $dispatcher->trigger('onK2BeforeSetQuery', array(&$query));
        $db->setQuery($query);
        $result = $db->loadResult();
        return $result;
    }

    function getCategoryTree($categories)
    {
        $mainframe = JFactory::getApplication();
        $db = JFactory::getDBO();
        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        if (!is_array($categories))
        {
            $categories = (array)$categories;
        }
        JArrayHelper::toInteger($categories);
        $categories = array_unique($categories);
        sort($categories);
        $key = implode('|', $categories);
        $clientID = $mainframe->getClientId();
        static $K2CategoryTreeInstances = array();
        if (isset($K2CategoryTreeInstances[$clientID]) && array_key_exists($key, $K2CategoryTreeInstances[$clientID]))
        {
            return $K2CategoryTreeInstances[$clientID][$key];
        }
        $array = $categories;
        while (count($array))
        {
            $query = "SELECT id
						FROM #__k2_categories 
						WHERE parent IN (".implode(',', $array).") 
						AND id NOT IN (".implode(',', $array).") ";
            if ($mainframe->isSite())
            {
                $query .= "
								AND published=1 
								AND trash=0";
                if (K2_JVERSION != '15')
                {
                    $query .= " AND access IN(".implode(',', $user->getAuthorisedViewLevels()).")";
                    if ($mainframe->getLanguageFilter())
                    {
                        $query .= " AND language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
                    }
                }
                else
                {
                    $query .= " AND access<={$aid}";
                }
            }
            $db->setQuery($query);
            $array = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
            $categories = array_merge($categories, $array);
        }
        JArrayHelper::toInteger($categories);
        $categories = array_unique($categories);
        $K2CategoryTreeInstances[$clientID][$key] = $categories;
        return $categories;
    }

    // Deprecated function, left for compatibility reasons
    function getCategoryChildren($catid, $clear = false)
    {

        static $array = array();
        if ($clear)
            $array = array();
        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        $catid = (int)$catid;
        $db = JFactory::getDBO();
        $query = "SELECT * FROM #__k2_categories WHERE parent={$catid} AND published=1 AND trash=0 AND access<={$aid} ORDER BY ordering ";
        $db->setQuery($query);
        $rows = $db->loadObjectList();

        foreach ($rows as $row)
        {
            array_push($array, $row->id);
            if ($this->hasChildren($row->id))
            {
                $this->getCategoryChildren($row->id);
            }
        }
        return $array;
    }

    // Deprecated function, left for compatibility reasons
    function hasChildren($id)
    {

        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        $id = (int)$id;
        $db = JFactory::getDBO();
        $query = "SELECT * FROM #__k2_categories WHERE parent={$id} AND published=1 AND trash=0 AND access<={$aid} ";
        $db->setQuery($query);
        $rows = $db->loadObjectList();

        if (count($rows))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    function getCategoryFirstChildren($catid, $ordering = NULL)
    {

        $mainframe = JFactory::getApplication();
        $user = JFactory::getUser();
        $aid = $user->get('aid');
        $db = JFactory::getDBO();
        $query = "SELECT * FROM #__k2_categories WHERE parent={$catid} AND published=1 AND trash=0";

        if (K2_JVERSION != '15')
        {
            $query .= " AND access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }
        }
        else
        {
            $query .= " AND access<={$aid} ";
        }

        switch ($ordering)
        {

            case 'order' :
                $order = " ordering ASC";
                break;

            case 'alpha' :
                $order = " name ASC";
                break;

            case 'ralpha' :
                $order = " name DESC";
                break;

            case 'reversedefault' :
                $order = " id DESC";
                break;

            default :
                $order = " id ASC";
                break;
        }

        $query .= " ORDER BY {$order}";

        $db->setQuery($query);
        $rows = $db->loadObjectList();
        if ($db->getErrorNum())
        {
            echo $db->stderr();
            return false;
        }

        return $rows;
    }

    function countCategoryItems($id)
    {

        $mainframe = JFactory::getApplication();
        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        $id = (int)$id;
        $db = JFactory::getDBO();

        $jnow = JFactory::getDate();
        $now = K2_JVERSION == '15' ? $jnow->toMySQL() : $jnow->toSql();
        $nullDate = $db->getNullDate();

        $categories = $this->getCategoryTree($id);
        $query = "SELECT COUNT(*) FROM #__k2_items WHERE catid IN (".implode(',', $categories).") AND published=1 AND trash=0";

        if (K2_JVERSION != '15')
        {
            $query .= " AND access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }
        }
        else
        {
            $query .= " AND access<=".$aid;
        }

        $query .= " AND ( publish_up = ".$db->Quote($nullDate)." OR publish_up <= ".$db->Quote($now)." )";
        $query .= " AND ( publish_down = ".$db->Quote($nullDate)." OR publish_down >= ".$db->Quote($now)." )";
        $db->setQuery($query);
        $total = $db->loadResult();
        return $total;
    }

    function getUserProfile($id = NULL)
    {

        $db = JFactory::getDBO();
        if (is_null($id))
            $id = JRequest::getInt('id');
        else
            $id = (int)$id;
        $query = "SELECT id, gender, description, image, url, `group`, plugins FROM #__k2_users WHERE userID={$id}";
        $db->setQuery($query);
        $row = $db->loadObject();
        return $row;
    }

    function getAuthorLatest($itemID, $limit, $userID)
    {

        $mainframe = JFactory::getApplication();
        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        $itemID = (int)$itemID;
        $userID = (int)$userID;
        $limit = (int)$limit;
        $db = JFactory::getDBO();

        $jnow = JFactory::getDate();
        $now = K2_JVERSION == '15' ? $jnow->toMySQL() : $jnow->toSql();
        $nullDate = $db->getNullDate();

        $query = "SELECT i.*, c.alias as categoryalias FROM #__k2_items as i 
				LEFT JOIN #__k2_categories c ON c.id = i.catid 
				WHERE i.id != {$itemID} 
				AND i.published = 1 
				AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." ) 
				AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." ) ";

        if (K2_JVERSION != '15')
        {
            $query .= " AND i.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND i.language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }
        }
        else
        {
            $query .= " AND i.access <= {$aid} ";
        }

        $query .= " AND i.trash = 0 
				AND i.created_by = {$userID} 
				AND i.created_by_alias='' 
				AND c.published = 1 ";

        if (K2_JVERSION != '15')
        {
            $query .= " AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND c.language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }
        }
        else
        {
            $query .= " AND c.access <= {$aid} ";
        }

        $query .= " AND c.trash = 0 
				ORDER BY i.created DESC";

        $db->setQuery($query, 0, $limit);
        $rows = $db->loadObjectList();

        foreach ($rows as $item)
        {
            //Image
            $item->imageXSmall = '';
            $item->imageSmall = '';
            $item->imageMedium = '';
            $item->imageLarge = '';
            $item->imageXLarge = '';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_XS.jpg'))
                $item->imageXSmall = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_XS.jpg';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_S.jpg'))
                $item->imageSmall = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_S.jpg';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_M.jpg'))
                $item->imageMedium = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_M.jpg';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_L.jpg'))
                $item->imageLarge = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_L.jpg';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_XL.jpg'))
                $item->imageXLarge = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_XL.jpg';

            if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_Generic.jpg'))
                $item->imageGeneric = JURI::root(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_Generic.jpg';
        }

        return $rows;
    }

    function getRelatedItems($itemID, $tags, $params)
    {

        $mainframe = JFactory::getApplication();
        $limit = $params->get('itemRelatedLimit', 10);
        $itemID = (int)$itemID;
        foreach ($tags as $tag)
        {
            $tagIDs[] = $tag->id;
        }
        JArrayHelper::toInteger($tagIDs);
        $sql = implode(',', $tagIDs);

        $user = JFactory::getUser();
        $aid = (int)$user->get('aid');
        $db = JFactory::getDBO();

        $jnow = JFactory::getDate();
        $now = K2_JVERSION == '15' ? $jnow->toMySQL() : $jnow->toSql();
        $nullDate = $db->getNullDate();

        $query = "SELECT DISTINCT itemID FROM #__k2_tags_xref WHERE tagID IN ({$sql}) AND itemID!={$itemID}";
        $db->setQuery($query);
        $itemsIDs = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();

        if (!count($itemsIDs))
            return array();

        $sql = implode(',', $itemsIDs);

        $query = "SELECT i.*, c.alias as categoryalias FROM #__k2_items as i 
				LEFT JOIN #__k2_categories c ON c.id = i.catid 
				WHERE i.published = 1 
				AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." ) 
				AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." ) ";

        if (K2_JVERSION != '15')
        {
            $query .= " AND i.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND i.language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }

        }
        else
        {
            $query .= " AND i.access <= {$aid} ";
        }

        $query .= " AND i.trash = 0 
				AND c.published = 1 ";

        if (K2_JVERSION != '15')
        {
            $query .= " AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
            if ($mainframe->getLanguageFilter())
            {
                $query .= " AND c.language IN(".$db->Quote(JFactory::getLanguage()->getTag()).", ".$db->Quote('*').")";
            }
        }
        else
        {
            $query .= " AND c.access <= {$aid} ";
        }

        $query .= " AND c.trash = 0 
				AND (i.id) IN ({$sql}) 
				ORDER BY i.created DESC";

        $db->setQuery($query, 0, $limit);
        $rows = $db->loadObjectList();
        K2Model::addIncludePath(JPATH_COMPONENT.DS.'models');
        $model = K2Model::getInstance('Item', 'K2Model');
        for ($key = 0; $key < sizeof($rows); $key++)
        {
            $rows[$key] = $model->prepareItem($rows[$key], 'relatedByTag', '');
            $rows[$key] = $model->execPlugins($rows[$key], 'relatedByTag', '');
            K2HelperUtilities::setDefaultImage($rows[$key], 'relatedByTag', $params);
        }
        return $rows;
    }

    function prepareSearch($search)
    {

        jimport('joomla.filesystem.file');
        $db = JFactory::getDBO();
        $language = JFactory::getLanguage();
        $defaultLang = $language->getDefault();
        $currentLang = $language->getTag();
        $length = JString::strlen($search);
        $sql = '';

        if (JRequest::getVar('categories'))
        {
            $categories = @explode(',', JRequest::getVar('categories'));
            JArrayHelper::toInteger($categories);
            $sql .= " AND c.id IN (".@implode(',', $categories).") ";
        }

        if (empty($search))
        {
            return $sql;
        }

        if (JString::substr($search, 0, 1) == '"' && JString::substr($search, $length - 1, 1) == '"')
        {
            $type = 'exact';
        }
        else
        {
            $type = 'any';
        }

        if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $currentLang != $defaultLang)
        {

            $conditions = array();
            $search_ignore = array();

            $ignoreFile = $language->getLanguagePath().DS.$currentLang.DS.$currentLang.'.ignore.php';

            if (JFile::exists($ignoreFile))
            {
                include $ignoreFile;
            }

            if ($type == 'exact')
            {

                $word = JString::substr($search, 1, $length - 2);

                if (JString::strlen($word) > 3 && !in_array($word, $search_ignore))
                {
                    $escaped = K2_JVERSION == '15' ? $db->getEscaped($word, true) : $db->escape($word, true);
					$langField = K2_JVERSION == '15' ? 'code' : 'lang_code';
                    $word = $db->Quote('%'.$escaped.'%', false);

                    $jfQuery = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
                    $jfQuery .= " WHERE jfc.reference_table = 'k2_items'";
                    $jfQuery .= " AND jfl.".$langField."=".$db->Quote($currentLang);
                    $jfQuery .= " AND jfc.published=1";
                    $jfQuery .= " AND jfc.value LIKE ".$word;
                    $jfQuery .= " AND (jfc.reference_field = 'title'
								OR jfc.reference_field = 'introtext'
								OR jfc.reference_field = 'fulltext'
								OR jfc.reference_field = 'image_caption'
								OR jfc.reference_field = 'image_credits'
								OR jfc.reference_field = 'video_caption'
								OR jfc.reference_field = 'video_credits'
								OR jfc.reference_field = 'extra_fields_search'
								OR jfc.reference_field = 'metadesc'
								OR jfc.reference_field = 'metakey'
					)";
                    $db->setQuery($jfQuery);
                    $result = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
                    $result = @array_unique($result);
                    JArrayHelper::toInteger($result);
                    if (count($result))
                    {
                        $conditions[] = "i.id IN(".implode(',', $result).")";
                    }

                }

            }
            else
            {
                $search = explode(' ', JString::strtolower($search));
                foreach ($search as $searchword)
                {

                    if (JString::strlen($searchword) > 3 && !in_array($searchword, $search_ignore))
                    {

                        $escaped = K2_JVERSION == '15' ? $db->getEscaped($searchword, true) : $db->escape($searchword, true);
                        $word = $db->Quote('%'.$escaped.'%', false);
                        $langField = K2_JVERSION == '15' ? 'code' : 'lang_code';

                        $jfQuery = " SELECT reference_id FROM #__jf_content as jfc LEFT JOIN #__languages as jfl ON jfc.language_id = jfl.".K2_JF_ID;
                        $jfQuery .= " WHERE jfc.reference_table = 'k2_items'";
                        $jfQuery .= " AND jfl.".$langField."=".$db->Quote($currentLang);
                        $jfQuery .= " AND jfc.published=1";
                        $jfQuery .= " AND jfc.value LIKE ".$word;
                        $jfQuery .= " AND (jfc.reference_field = 'title'
									OR jfc.reference_field = 'introtext'
									OR jfc.reference_field = 'fulltext'
									OR jfc.reference_field = 'image_caption'
									OR jfc.reference_field = 'image_credits'
									OR jfc.reference_field = 'video_caption'
									OR jfc.reference_field = 'video_credits'
									OR jfc.reference_field = 'extra_fields_search'
									OR jfc.reference_field = 'metadesc'
									OR jfc.reference_field = 'metakey'
						)";
                        $db->setQuery($jfQuery);
                        $result = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
                        $result = @array_unique($result);
                        foreach ($result as $id)
                        {
                            $allIDs[] = $id;
                        }

                        if (JFile::exists(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_joomfish'.DS.'joomfish.php') && $currentLang != $defaultLang)
                        {

                            if (isset($allIDs) && count($allIDs))
                            {
                                JArrayHelper::toInteger($allIDs);
                                $conditions[] = "i.id IN(".implode(',', $allIDs).")";
                            }

                        }

                    }

                }

            }

            if (count($conditions))
            {
                $sql .= " AND (".implode(" OR ", $conditions).")";
            }

        }
        else
        {

            $sql .= " AND MATCH(i.title, i.introtext, i.`fulltext`,i.image_caption,i.image_credits,i.video_caption,i.video_credits,i.extra_fields_search,i.metadesc,i.metakey) ";
            if ($type == 'exact')
            {
                $text = JString::trim($search, '"');
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($text, true) : $db->escape($text, true);
                $text = $db->Quote('"'.$db->getEscaped($text, true).'"', false);
            }
            else
            {
                $search = JString::str_ireplace('*', '', $search);
                $words = explode(' ', $search);
                for ($i = 0; $i < count($words); $i++)
                {
                    $words[$i] .= '*';
                }
                $search = implode(' ', $words);
                $escaped = K2_JVERSION == '15' ? $db->getEscaped($search, true) : $db->escape($search, true);
                $text = $db->Quote($escaped, false);
            }
            $sql .= " AGAINST ({$text} IN BOOLEAN MODE)";

        }

        return $sql;
    }

    function getModuleItems($moduleID)
    {

        $db = JFactory::getDBO();
        $query = "SELECT * FROM #__modules WHERE id={$moduleID} AND published=1 AND client_id=0";
        $db->setQuery($query, 0, 1);
        $module = $db->loadObject();
        $format = JRequest::getWord('format');
        if (is_null($module))
            JError::raiseError(404, JText::_('K2_NOT_FOUND'));
        else
        {
            $params = class_exists('JParameter') ? new JParameter($module->params) : new JRegistry($module->params);
            switch ($module->module)
            {

                case 'mod_k2_content' :
                    require_once (JPATH_SITE.DS.'modules'.DS.'mod_k2_content'.DS.'helper.php');
                    $helper = new modK2ContentHelper;
                    $items = $helper->getItems($params, $format);
                    break;

                case 'mod_k2_comments' :
                    if ($params->get('module_usage') == 1)
                        JError::raiseError(404, JText::_('K2_NOT_FOUND'));

                    require_once (JPATH_SITE.DS.'modules'.DS.'mod_k2_comments'.DS.'helper.php');
                    $helper = new modK2CommentsHelper;
                    $items = $helper->getLatestComments($params);

                    foreach ($items as $item)
                    {
                        $item->title = $item->userName.' '.JText::_('K2_COMMENTED_ON').' '.$item->title;
                        $item->introtext = $item->commentText;
                        $item->created = $item->commentDate;
                        $item->id = $item->itemID;
                    }
                    break;

                default :
                    JError::raiseError(404, JText::_('K2_NOT_FOUND'));
            }

            $result = new JObject;
            $result->items = $items;
            $result->title = $module->title;
            $result->module = $module->module;
            $result->params = $module->params;
            return $result;

        }

    }

}
